home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 050 / madtrb1.arc / G_INPUT.INC < prev    next >
Text File  |  1986-03-04  |  49KB  |  1,203 lines

  1. { G_INPUT.INC }
  2.  
  3. { *************************************************************************** }
  4. { *                                                                         * }
  5. { *                TURBO SCREEN INPUT PRE-PROCESSOR TOOLKIT                 * }
  6. { *                                                                         * }
  7. { *                 GENERAL INPUT SUBPROGRAM INCLUDE FILE                   * }
  8. { *                                                                         * }
  9. { *                             Version  1.07                               * }
  10. { *                                                                         * }
  11. { *                                                                         * }
  12. { *    This file contains all the modules necessary for your use of the     * }
  13. { *    input pre-processor to support as many general input pages as your   * }
  14. { *    application program requires.                                        * }
  15. { *                                                                         * }
  16. { *    Note that further documentation on general input page support can    * }
  17. { *    be found in the documentation file 'Tsipp.Doc'.                      * }
  18. { *                                                                         * }
  19. { *************************************************************************** }
  20.  
  21.  
  22.  
  23. Const { General Input Page Data Structure Constants }
  24.  
  25.   G_I_RECORD_LIMIT=40;                 { maximum number of entries allowed in any given }
  26.                                        { general input page }
  27.  
  28.   MAX_SIZE_OF_G_I_PROMPT=50;           { size of general input prompt string }
  29.  
  30.   MAX_SIZE_OF_G_I_ENTRY=40;            { size of input data entry string }
  31.  
  32.  
  33.  
  34. Type { General Input Page Data Structure }
  35.  
  36.   G_I_RecordPtr=^G_I_Record;           { pointer to a general input page template record }
  37.                                        { which is stored in the heap }
  38.   G_I_Record=                          { record type used for general input page templates }
  39.     Record                             { used to store specific information about a particular }
  40.       PromptCol,                       { general input page prompt }
  41.       PromptRow,
  42.       InputCol,
  43.       InputRow,
  44.       InputLength,
  45.       InputDataType,
  46.       ReturnKeyPointer,
  47.       UpKeyPointer,
  48.       DownKeyPointer,
  49.       LeftKeyPointer,
  50.       RightKeyPointer:Integer;
  51.       Prompt:String[MAX_SIZE_OF_G_I_PROMPT];
  52.     End; { G_I_Record }
  53.  
  54.   Typical_G_I_Page=                    { a record data type which stores }
  55.     Record                             { for each general input page: }
  56.       Image:TextScreenPtr;                                  { a general input page screen image }
  57.       Template:Array[1..G_I_RECORD_LIMIT] Of G_I_RecordPtr; { a general input page screen template }
  58.     End; { Typical_G_I_Page }
  59.  
  60.   G_I_DataEntryPtr=^G_I_DataEntry;             { pointer to an input data string entry }
  61.   G_I_DataEntry=String[MAX_SIZE_OF_G_I_ENTRY]; { data string type used for storing input data entries }
  62.  
  63.  
  64.  
  65. Var { General Input Page Data Structure Variables }
  66.  
  67.   G_I_Pages:                                            { an array constructed of the data type Typical }
  68.     Array[1..MAX_NUM_OF_G_I_PAGES] Of Typical_G_I_Page; { general input page }
  69.  
  70.   G_I_Data:                                             { two dimensional array for storing input data from }
  71.     Array[1..G_I_RECORD_LIMIT,1..MAX_NUM_OF_G_I_PAGES] Of G_I_DataEntryPtr; { the general input pages }
  72.  
  73.  
  74.  
  75.   { miscellaneous variables for the example application of the input pre-processor }
  76.  
  77.   NewFile:Boolean;                   { a boolean flag used in detecting if the current }
  78.                                      { listed input file name is a newly created file }
  79.   BeamLength:Real;                   { variable use to store converted beam length }
  80.  
  81.  
  82.  
  83. Procedure Read_G_I_Files;
  84.  
  85. { This procedure reads the general input screen page images and templates and
  86.   stores them into the proper G_I_Pages[G_I_Page] record.  Note that G_I_Page
  87.   screen page images are stored under the file names 'G_I_##.Col(or Mon)',
  88.   where ## refers to the G_I_Page number, 'Col' refers to a color screen
  89.   page, and 'Mon' refers to a monochrome screen page.  Note that G_I_Page
  90.   templates are stored under the file names 'G_I_##.@@@', where ## refers to
  91.   the general input page number and '@@@' refers to template file extension
  92.   constant previously defined in the file 'Main.Mod'.
  93.  
  94.   Note that the template records are pointed to by the template array (an
  95.   array of pointers) and if there are not enough records from the template
  96.   file to fill the template array of pointers for a particular G_I_Page,
  97.   those empty array pointers are set to Nil. }
  98.  
  99. Var
  100.   G_I_Page:Integer;                    { an index to a particular general input page }
  101.   RecordNumber:Integer;                { an index to a particular general input template record }
  102.   Page:String[2];                      { a string used in determining the current G_I_Page file number }
  103.   G_I_TemplateFile:File Of G_I_Record; { G_I_Page file template type }
  104.  
  105. Begin   { Read_G_I_Files }
  106.   For G_I_Page:=1 To MAX_NUM_OF_G_I_PAGES Do
  107.     With G_I_Pages[G_I_Page] Do
  108.       Begin
  109.  
  110.         { determine file number portion of G_I_Page file name }
  111.         Str(G_I_Page,Page);            { convert integer file number into a string }
  112.         If G_I_Page<=9 Then
  113.           Page:='0'+Page;
  114.  
  115.         { initializing screen page pointer }
  116.         Image:=Nil;
  117.  
  118.         { read G_I_Page screen image }
  119.         ReadScreenPageFromFile('G_I_'+Page,Image);
  120.  
  121.         { read G_I_Page template }
  122.         Assign(G_I_TemplateFile,'G_I_'+Page+TEMPLATE_FILE_NAME_EXTENSION); { assign to a disk file }
  123.         Reset(G_I_TemplateFile);       { open the file for reading }
  124.         For RecordNumber:=1 To G_I_RECORD_LIMIT Do
  125.           If Not Eof(G_I_TemplateFile) Then
  126.             Begin
  127.               New(Template[RecordNumber]); { allocate space in heap for template record }
  128.               Read(G_I_TemplateFile,Template[RecordNumber]^); { read record off of disk }
  129.             End { If Not Eof }
  130.           Else
  131.             Template[RecordNumber]:=Nil; { no record to read, set pointer in template array to Nil }
  132.         Close(G_I_TemplateFile);       { close the file }
  133.  
  134.       End; { With G_I_Pages[G_I_Page] }
  135. End;    { Read_G_I_Files }
  136.  
  137.  
  138.  
  139. Procedure Init_G_I_DataEntries;
  140.  
  141. { This procedure initializes the general input page input data array.  Note
  142.   that the pointers of the data array that don't correspond to any data
  143.   entry on a particular G_I_Page are set to Nil. }
  144.  
  145. Var
  146.   Page:Integer;                        { an index to a particular G_I_Page }
  147.   Entry:Integer;                       { an index to a particular G_I_Page record }
  148.  
  149. Begin   { Init_G_I_DataEntries }
  150.   For Page:=1 To MAX_NUM_OF_G_I_PAGES Do
  151.     For Entry:=1 To G_I_RECORD_LIMIT Do
  152.       If G_I_Pages[Page].Template[Entry]=Nil Then
  153.         G_I_Data[Entry,Page]:=Nil      { no corresponding prompt entry in template }
  154.       Else
  155.         Begin
  156.           New(G_I_Data[Entry,Page]);   { allocate space in heap for input data }
  157.           G_I_Data[Entry,Page]^:='';   { corresponding data entry in template }
  158.         End; { Else }
  159. End;    { Init_G_I_DataEntries }
  160.  
  161.  
  162.  
  163. Procedure DisposeOf_G_I_DynamicMemory;
  164.  
  165. { This procedure releases all the dynamically allocated memory used in the
  166.   general input pages back to the operating system. }
  167.  
  168. Var
  169.   G_I_Page:Integer;                    { an index to a particular G_I_Page }
  170.   Entry:Integer;                       { an index to a particular G_I_Page template entry }
  171.  
  172. Begin   { DisposeOf_G_I_DynamicMemory }
  173.   For G_I_Page:=1 To MAX_NUM_OF_G_I_PAGES Do
  174.     Begin
  175.       Dispose(G_I_Pages[G_I_Page].Image);                  { dispose screen page image }
  176.       For Entry:=1 To G_I_RECORD_LIMIT Do
  177.         If G_I_Pages[G_I_Page].Template[Entry]<>Nil Then
  178.           Begin
  179.             Dispose(G_I_Pages[G_I_Page].Template[Entry]);  { dispose of template entry }
  180.             Dispose(G_I_Data[Entry,G_I_Page]);             { dispose of data entry }
  181.           End; { If G_I_Pages }
  182.     End; { For G_I_Page }
  183. End;    { DisposeOf_G_I_DynamicMemory }
  184.  
  185.  
  186.  
  187. Procedure Write_G_I_Entries;
  188.  
  189. { This procedure locates and prints on the screen the input entries for the
  190.   current general input page.  This procedure looks at the G_I_Page template to
  191.   determine the required information for locating and printing out each
  192.   G_I_Page input entry. }
  193.  
  194. Var
  195.   Index:Integer;                       { index counter used in listing out the G_I prompts and data entries }
  196.   Col:Integer;                         { column index counter used in erasing old input data entries }
  197.   TextString:WorkString;               { temporary string used in clearing out an old entry }
  198.  
  199. Begin   { Write_G_I_Entries }
  200.   TextColor(ForegroundColor);
  201.   TextBackground(BackgroundColor);
  202.   Window(1,1,80,25);                   { reset the active window }
  203.   Index:=1;                            { initialize counter }
  204.   While G_I_Pages[G_I_Page].Template[Index]<>Nil Do { check that there is a valid prompt listing }
  205.     Begin                              { print out data entry }
  206.       With G_I_Pages[G_I_Page].Template[Index]^ Do
  207.         Begin
  208.  
  209.           { this routine removes old input data entry }
  210.           TextString:='';              { initialize to nul string }
  211.           For Col:=1 To InputLength Do { build blank string }
  212.             TextString:=TextString+' ';
  213.           SpeedPrint(TextString,InputCol,InputRow);
  214.  
  215.           { write out data entry }
  216.           TextString:=G_I_Data[Index,G_I_Page]^; { convert data string into a WorkString }
  217.           SpeedPrint(TextString,InputCol,InputRow);
  218.  
  219.         End; { With G_I_Pages }
  220.       Index:=Index+1;                  { increment counter }
  221.     End; { While G_I_Pages }
  222. End;    { Write_G_I_Entries }
  223.  
  224.  
  225.  
  226. Procedure HighlightSpecial_G_I_Prompts;
  227.  
  228. { This procedure highlights the special quick input keystroke characters for
  229.   specific G_I_Page prompts.  Note that the case statement below only supports
  230.   4 general input pages, but can easily be added to inorder to support
  231.   additional pages. }
  232.  
  233. Begin   { HighlightSpecial_G_I_Prompts }
  234.   TextColor(QuickInputHighlightColor);
  235.   TextBackground(BackgroundColor);
  236.   Case G_I_Page Of
  237.     1 : Begin
  238.           GotoXY(21,9);
  239.             Write('U');
  240.           GotoXY(21,10);
  241.             Write('U');
  242.           GotoXY(33,13);
  243.             Write('PA');
  244.           GotoXY(42,13);
  245.             Write('PE');
  246.           GotoXY(28,14);
  247.             Write('I');
  248.           GotoXY(37,14);
  249.             Write('E');
  250.           GotoXY(29,15);
  251.             Write('S');
  252.           GotoXY(36,15);
  253.             Write('U');
  254.         End; { page 1 }
  255.     2 : Begin
  256.         End; { page 2 }
  257.     3 : Begin
  258.         End; { page 3 }
  259.     4 : Begin
  260.         End; { page 4 }
  261.   End; { Case G_I_Page }
  262. End;    { HighlightSpecial_G_I_Prompts }
  263.  
  264.  
  265.  
  266. Procedure Show_G_I_EmptyEntry(    Descriptor:Integer);
  267.  
  268. { This procedure prints out the proper sized reversed video input block
  269.   at the passed descriptor prompt (prompt that the cursor is located at) to
  270.   show an empty input data entry. }
  271.  
  272. Var
  273.   Col:Integer;                         { column index counter used in displaying empty input data entry }
  274.  
  275. Begin   { Show_G_I_EmptyEntry }
  276.   TextColor(BlockForegroundColor);
  277.   TextBackground(BlockBackgroundColor);
  278.   With G_I_Pages[G_I_Page].Template[Descriptor]^ Do
  279.     Begin
  280.       GotoXY(InputCol,InputRow);
  281.       For Col:=1 To InputLength Do
  282.         Write(' ');
  283.       GotoXY(InputCol,InputRow);
  284.     End; { With G_I_Pages }
  285. End;    { Show_G_I_EmptyEntry }
  286.  
  287.  
  288.  
  289. Procedure Show_G_I_CharEntry(    LegalChar:Char);
  290.  
  291. { This procedure prints the passed legal character entry at wherever the cursor
  292.   happens to be positioned at. }
  293.  
  294. Begin   { Show_G_I_CharEntry }
  295.   TextColor(CharacterInputColor);
  296.   TextBackground(BackgroundColor);
  297.   Write(LegalChar);
  298. End;    { Show_G_I_CharEntry }
  299.  
  300.  
  301.  
  302. Procedure Move_G_I_InputPromptBlockModule(    OldPrompt,
  303.                                               NewPrompt:Integer);
  304.  
  305. { *************************************************************************** }
  306. { *                                                                         * }
  307. { *           MOVE GENERAL INPUT PAGE INPUT PROMPT BLOCK MODULE             * }
  308. { *                                                                         * }
  309. { *    This module controls the movement of the highlighted prompt and      * }
  310. { *    input block for the passed old and new prompt entry number for the   * }
  311. { *    current general input page.                                          * }
  312. { *                                                                         * }
  313. { *************************************************************************** }
  314.  
  315.  
  316.  
  317.   Procedure ShowInputPrompt(    Descriptor,
  318.                                 PromptColor,
  319.                                 PromptBackground,
  320.                                 InputBlockColor,
  321.                                 InputBlockBackground:Integer);
  322.  
  323.   { This procedure is used exclusively to highlight the current input prompt
  324.     and input block and also to de-highlight the previous input prompt and
  325.     input block. }
  326.  
  327.   Var
  328.     Col:Integer;                       { column index counter used in displaying an empty input data entry }
  329.  
  330.   Begin   { ShowInputPrompt }
  331.     With G_I_Pages[G_I_Page].Template[Descriptor]^ do
  332.       Begin
  333.  
  334.         { re-write prompt in passed screen colors }
  335.         TextColor(PromptColor);
  336.         TextBackground(PromptBackground);
  337.         GotoXY(PromptCol,PromptRow);
  338.         Write(Prompt);
  339.  
  340.         { clear input data entry }
  341.         GotoXY(InputCol,InputRow);
  342.         For Col:=1 To InputLength Do
  343.           Write(' ');
  344.  
  345.         { re-write input data entry in passed screen colors }
  346.         TextColor(InputBlockColor);
  347.         TextBackground(InputBlockBackground);
  348.         GotoXY(InputCol,InputRow);
  349.         If Length(G_I_Data[Descriptor,G_I_Page]^)=0 Then
  350.           For Col:=1 To InputLength Do { write out empty entry ( reversed video input block) }
  351.             Write(' ')
  352.         Else { write out input entry }
  353.           Write(G_I_Data[Descriptor,G_I_Page]^);
  354.  
  355.       End; { With G_I_Pages }
  356.   End;    { ShowInputPrompt }
  357.  
  358.  
  359.  
  360. Begin   { Move_G_I_InputPromptBlockModule }
  361.   ShowInputPrompt(OldPrompt,           { de-highlight old input prompt and input data entry }
  362.                   ForegroundColor,
  363.                   BackgroundColor,
  364.                   ForegroundColor,
  365.                   BackgroundColor);
  366.   ShowInputPrompt(NewPrompt,           { highlight new input prompt and input data entry }
  367.                   HighlightColor,
  368.                   BackgroundColor,
  369.                   BlockForegroundColor,
  370.                   BlockBackgroundColor);
  371.   HighlightSpecial_G_I_Prompts;
  372. End;    { Move_G_I_InputPromptBlockModule }
  373.  
  374.  
  375.  
  376. Procedure Draw_G_I_PagesModule;
  377.  
  378. { *************************************************************************** }
  379. { *                                                                         * }
  380. { *                   DRAW GENERAL INPUT PAGES MODULE                       * }
  381. { *                                                                         * }
  382. { *    This module controls the display of particular general input pages.  * }
  383. { *    Note that the case statement below only supports 4 general input     * }
  384. { *    pages, but this can easily be added to inorder for this module to    * }
  385. { *    support additional general input pages.                              * }
  386. { *                                                                         * }
  387. { *    Note that within this module there is an example procedure that      * }
  388. { *    was used during program development to construct a screen page.      * }
  389. { *    Later, the screen pages are read from screen files and stored in the * }
  390. { *    heap for more rapid display.                                         * }
  391. { *                                                                         * }
  392. { *************************************************************************** }
  393.  
  394.  
  395.  
  396.   Procedure Write_G_I_Prompts;
  397.  
  398.   { This procedure locates and prints on the screen the prompts for the current
  399.     general input page.  This procedure looks at the G_I_Page template to
  400.     determine the required information for locating and printing out each
  401.     G_I_Page prompt. }
  402.  
  403.   Var
  404.     Index:Integer;                     { index counter used in listing out the G_I prompts }
  405.  
  406.   Begin   { Write_G_I_Prompts }
  407.     TextColor(ForegroundColor);
  408.     TextBackground(BackgroundColor);
  409.     Index:=1;                          { initialize counter }
  410.     While G_I_Pages[G_I_Page].Template[Index]<>Nil Do { check that there is a valid prompt listing }
  411.       Begin                            { print out G_I prompt }
  412.         With G_I_Pages[G_I_Page].Template[Index]^ Do
  413.           Begin
  414.             GotoXY(PromptCol,PromptRow);
  415.               SpeedWrite(Prompt);
  416.           End; { With G_I_Pages }
  417.         Index:=Index+1;                { increment counter }
  418.       End; { While G_I_Pages }
  419.   End;    { Write_G_I_Prompts }
  420.  
  421.  
  422.  
  423.   Procedure Draw_G_I_Page01;
  424.  
  425.   { This part of the procedure was used during program development to
  426.     construct a screen page.  This screen page is now stored in a screen file
  427.     and thus the application program does not really need this code any longer.
  428.     The screen page is read from a file and stored in the heap for rapid
  429.     display.
  430.  
  431.     You may want to write a similar procedure during your application program
  432.     development. }
  433.  
  434.   Var
  435.     TextString:WorkString;             { string variable used in passing text to another procedure }
  436.  
  437.   Begin   { Draw_G_I_Page01 }
  438.     TextColor(ForegroundColor);
  439.     TextBackground(BackgroundColor);
  440.     DrawWindow2(1,1,80,25);            { place border along edge of screen }
  441.  
  442.     { place title on top of screen }
  443.     TextColor(HighlightColor);
  444.     WriteCenterText(1,'GENERAL INPUT DATA');
  445.  
  446.     { place menu on bottom portion of screen pertaining to proper page }
  447.     TextColor(ForegroundColor);
  448.     TextString:='Home(Directory)   PgDn   '+Chr(27)+'   '+Chr(26)+'   '+Chr(24)+'   '+Chr(25)+'   Del   Esc';
  449.     WriteCenterText(25,TextString);
  450.  
  451.     DrawHorizWindowLine2(1,12,80);
  452.     DrawHorizWindowLine2(1,16,80);
  453.  
  454.     Write_G_I_Prompts;
  455.     HighlightSpecial_G_I_Prompts;
  456. (*  WriteScreenPageToFile('G_I_01');   { write the screen page off to a screen file } *)
  457.   End;    { Draw_G_I_Page01 }
  458.  
  459.  
  460.  
  461. Begin   { Draw_G_I_PagesModule }
  462.   Case G_I_Page Of
  463.     1 : Begin
  464. (*        Draw_G_I_Page01;             { this line was used during program development } *)
  465.           DisplayScreenPage(G_I_Pages[G_I_Page].Image); { display screen page that is stored in the heap }
  466.  
  467.           { specific routine for example application of the input pre-processor }
  468.           If NewFile Then
  469.             LabelNewFile; { label user defined input data file as new file }
  470.  
  471.         End; { page 1 }
  472.     2 : Begin
  473.         End; { page 2 }
  474.     3 : Begin
  475.         End; { page 3 }
  476.     4 : Begin
  477.         End; { page 4 }
  478.   End; { Case G_I_Page }
  479.   Write_G_I_Entries;
  480.   Move_G_I_InputPromptBlockModule(1,1);
  481. End;    { Draw_G_I_PagesModule }
  482.  
  483.  
  484.  
  485. Procedure Check_G_I_CharEntryModule(    Descriptor    :Integer;
  486.                                     Var AccumDataEntry:WorkString;
  487.                                         CharEntry     :Char);
  488.  
  489. { *************************************************************************** }
  490. { *                                                                         * }
  491. { *          CHECK GENERAL INPUT PAGE CHARACTER INPUT ENTRY MODULE          * }
  492. { *                                                                         * }
  493. { *   This module checks the passed CharEntry character by checking to see  * }
  494. { *   that it is a legal character for the passed Descriptor (or current    * }
  495. { *   prompt).  If CharEntry is legal then this module adds the CharEntry   * }
  496. { *   to the passed AccumDataEntry (accumulated data entry string).  If     * }
  497. { *   CharEntry is not legal then this module ignores the passed character  * }
  498. { *   and sounds an error to identify that the user has keystroked in an    * }
  499. { *   illegal character.                                                    * }
  500. { *                                                                         * }
  501. { *   This module begins by first checking to see if the accumulated data   * }
  502. { *   entry length is less than the maximum allowed length.  Finally the    * }
  503. { *   module checks that to see if the single character that has been       * }
  504. { *   entered is of the type allowed.                                       * }
  505. { *                                                                         * }
  506. { *   A list of different input data types this module can check for        * }
  507. { *   follows:                                                              * }
  508. { *                                                                         * }
  509. { *         Input                                                           * }
  510. { *         Data                                                            * }
  511. { *         Type                                                            * }
  512. { *         Value       Description of Input Data Type                      * }
  513. { *         -----       -----------------------------------------           * }
  514. { *           1         Positive Integer ( including zero )                 * }
  515. { *           2         Negative Integer ( including zero )                 * }
  516. { *           3         Integer                                             * }
  517. { *           4         Positive Real ( including zero )                    * }
  518. { *           5         Negative Real ( including zero )                    * }
  519. { *           6         Real                                                * }
  520. { *           7         Data File Name                                      * }
  521. { *           8         Disk Drive Subdirectory Path                        * }
  522. { *           9         General                                             * }
  523. { *                                                                         * }
  524. { *************************************************************************** }
  525.  
  526.  
  527. Type
  528.   CharSet=Set Of Char;                 { a set of legal characters used for checking the character entry }
  529.  
  530. Var
  531.   LegalCharSet:CharSet;                { a variable used for storing a set of legal characters }
  532.  
  533.  
  534.  
  535.   Procedure DetermineLegalCharSet(    DataType    :Integer;
  536.                                       DataEntry   :WorkString;
  537.                                   Var LegalCharSet:CharSet);
  538.  
  539.   { This procedure determines the legal set of characters for the current data
  540.     entry by looking at the passed DataType value. }
  541.  
  542.   Var
  543.     DecimalOccurrence:Boolean;         { boolean used to test for the occurence of a decimal point in the passed string }
  544.  
  545.   Begin   { DetermineLegalCharSet }
  546.     DecimalOccurrence:=(Pos('.',DataEntry)<>0); { If true then decimal point is contained within data entry }
  547.     Case DataType Of
  548.       1 : Begin { Positive Integer }
  549.             LegalCharSet:=['0'..'9'];
  550.           End;  { Positive Integer }
  551.       2 : Begin { Negative Integer }
  552.             If Length(DataEntry)=0 Then
  553.               LegalCharSet:=['-']
  554.             Else
  555.               LegalCharSet:=['0'..'9'];
  556.           End;  { Negative Integer }
  557.       3 : Begin { Integer }
  558.             If Length(DataEntry)=0 Then
  559.               LegalCharSet:=['-','0'..'9']
  560.             Else
  561.               LegalCharSet:=['0'..'9'];
  562.           End;  { Integer }
  563.       4 : Begin { Positive Real }
  564.             If DecimalOccurrence Then
  565.               LegalCharSet:=['0'..'9']
  566.             Else
  567.               LegalCharSet:=['.','0'..'9'];
  568.           End;  { Positive Real }
  569.       5 : Begin { Negative Real }
  570.             If Length(DataEntry)=0 Then
  571.               LegalCharSet:=['-']
  572.             Else
  573.               If DecimalOccurrence Then
  574.                 LegalCharSet:=['0'..'9']
  575.               Else
  576.                 LegalCharSet:=['.','0'..'9'];
  577.           End;  { Negative Real }
  578.       6 : Begin { Real }
  579.             If Length(DataEntry)=0 Then
  580.               LegalCharSet:=['-','.','0'..'9']
  581.             Else
  582.               If DecimalOccurrence Then
  583.                 LegalCharSet:=['0'..'9']
  584.               Else
  585.                 LegalCharSet:=['.','0'..'9'];
  586.           End;  { Real }
  587.       7 : Begin { Data File Name }
  588.             LegalCharSet:=['A'..'Z','a'..'z','0'..'9','_','-','!','@','#','$',
  589.                            '%','&'];
  590.           End;  { Data File Name }
  591.       8 : Begin { Disk Drive Subdirectory Path }
  592.             LegalCharSet:=['A'..'Z','a'..'z','0'..'9','_','-','!','@','#','$',
  593.                            '%','&','\',':'];
  594.           End;  { Disk Drive Subdirectory Path }
  595.       9 : Begin { General }
  596.             LegalCharSet:=['A'..'Z','a'..'z','0'..'9','`','~','!','@','#','$',
  597.                            '%','^','&','*','(',')','-','_','=','+','\','|','[',
  598.                            '{',']','}',';',':','"',',','<','.','>','/','?',' '];
  599.           End;  { General }
  600.     End; { Case DataType }
  601.   End;    { DetermineLegalCharSet }
  602.  
  603.  
  604.  
  605. Begin   { Check_G_I_CharEntryModule }
  606.   With G_I_Pages[G_I_Page].Template[Descriptor]^ Do
  607.     Begin
  608.       If Length(AccumDataEntry)<InputLength Then { check length of accumulated data entry }
  609.         Begin
  610.           DetermineLegalCharSet(InputDataType,AccumDataEntry,LegalCharSet);
  611.           If CharEntry In LegalCharSet Then
  612.             Begin { legal character entry, add to accumulated data entry }
  613.               AccumDataEntry:=AccumDataEntry+CharEntry;
  614.               If Length(AccumDataEntry)=1 Then
  615.                 Show_G_I_EmptyEntry(Descriptor);
  616.               Show_G_I_CharEntry(CharEntry);
  617.             End { If CharEntry }
  618.           Else { illegal character entry }
  619.             SoundError;
  620.         End { If Length(accumDataEntry) }
  621.       Else { allowable length of accumulated character entry has been reached, no more entry of characters allowed }
  622.         SoundError;
  623.     End; { With G_I_Pages }
  624. End;    { Check_G_I_CharEntryModule }
  625.  
  626.  
  627.  
  628. Procedure Special_G_I_CharEntryModule(Var OldPrompt,
  629.                                           NewPrompt:Integer;
  630.                                           CharEntry:Char);
  631.  
  632. { *************************************************************************** }
  633. { *                                                                         * }
  634. { *            SPECIAL GENERAL INPUT PAGE CHARACTER ENTRY MODULE            * }
  635. { *                                                                         * }
  636. { *    There may be specific input data entries that have been defined to   * }
  637. { *    have 2, 3, or more special characters as input.  This module checks  * }
  638. { *    for the entry of these special characters.                           * }
  639. { *                                                                         * }
  640. { *    Note that the case statement below only supports 4 general input     * }
  641. { *    pages, but this can easily be added to inorder for this module to    * }
  642. { *    support additional general input pages.                              * }
  643. { *                                                                         * }
  644. { *    Note that the procedures within this module have been written        * }
  645. { *    specifically for the example application of the input pre-processor. * }
  646. { *    You may want to write similar procedures for your application.       * }
  647. { *                                                                         * }
  648. { *************************************************************************** }
  649.  
  650.  
  651.  
  652.   Procedure DeckOrientation(    CharEntry:Char);
  653.  
  654.   { This procedure controls the selection of deck orientation.  Note that
  655.     the special characters defined for this entry are:
  656.  
  657.                   'PA' = PARALLEL
  658.                   'PE' = PERPENDICULAR            }
  659.  
  660.   Begin   { DeckOrientation }
  661.     If Not(CharEntry In ['P','p']) Then
  662.       SoundError { illegal character entry }
  663.     Else
  664.       Begin
  665.         CharEntry:='P';
  666.         With G_I_Pages[G_I_Page].Template[NewPrompt]^ Do
  667.           GotoXY(InputCol,InputRow);
  668.         Show_G_I_CharEntry(CharEntry);
  669.         Repeat
  670.           Read(Kbd,CharEntry);
  671.           If Not(CharEntry In ['A','a','E','e']) Then
  672.             SoundError;                { illegal entry }
  673.         Until CharEntry In ['A','a','E','e'];
  674.         If CharEntry In ['A','a'] Then
  675.           Begin
  676.             G_I_Data[NewPrompt,G_I_Page]^:='PARALLEL';
  677.             OldPrompt:=NewPrompt;
  678.             NewPrompt:=G_I_Pages[G_I_Page].Template[NewPrompt]^.ReturnKeyPointer; { determine next record }
  679.             Move_G_I_InputPromptBlockModule(OldPrompt,NewPrompt);
  680.           End { If CharEntry }
  681.         Else
  682.           If CharEntry In ['E','e'] Then
  683.             Begin
  684.               G_I_Data[NewPrompt,G_I_Page]^:='PERPENDICULAR';
  685.               OldPrompt:=NewPrompt;
  686.               NewPrompt:=G_I_Pages[G_I_Page].Template[NewPrompt]^.ReturnKeyPointer; { determine next record }
  687.               Move_G_I_InputPromptBlockModule(OldPrompt,NewPrompt);
  688.             End { If CharEntry }
  689.           Else { illegal character entry }
  690.             SoundError;
  691.       End; { Else }
  692.   End;    { DeckOrientation }
  693.  
  694.  
  695.  
  696.   Procedure MemberType(    CharEntry:Char);
  697.  
  698.   { This procedure controls the selection of beam member type.  Note that
  699.     the special characters defined for this entry are:
  700.  
  701.                   'I' = INTERIOR
  702.                   'E' = EDGE            }
  703.  
  704.  
  705.   Begin   { MemberType }
  706.     If CharEntry In ['I','i'] Then
  707.       Begin
  708.         G_I_Data[NewPrompt,G_I_Page]^:='INTERIOR';
  709.         OldPrompt:=NewPrompt;
  710.         NewPrompt:=G_I_Pages[G_I_Page].Template[NewPrompt]^.ReturnKeyPointer; { determine next record to move to }
  711.         Move_G_I_InputPromptBlockModule(OldPrompt,NewPrompt);
  712.       End { If CharEntry }
  713.     Else
  714.       If CharEntry In ['E','e'] Then
  715.         Begin
  716.           G_I_Data[NewPrompt,G_I_Page]^:='EDGE';
  717.           OldPrompt:=NewPrompt;
  718.           NewPrompt:=G_I_Pages[G_I_Page].Template[NewPrompt]^.ReturnKeyPointer; { determine next record to move to }
  719.           Move_G_I_InputPromptBlockModule(OldPrompt,NewPrompt);
  720.         End { If CharEntry }
  721.       Else { illegal character entry }
  722.         SoundError;
  723.   End;    { MemberType }
  724.  
  725.  
  726.  
  727.   Procedure Construction(    CharEntry:Char);
  728.  
  729.   { This procedure controls the selection of construction type.  Note that
  730.     the special characters defined for this entry are:
  731.  
  732.                   'S' = SHORED
  733.                   'U' = UNSHORED        }
  734.  
  735.  
  736.   Begin   { Construction }
  737.     If CharEntry In ['S','s'] Then
  738.       Begin
  739.         G_I_Data[NewPrompt,G_I_Page]^:='SHORED';
  740.         OldPrompt:=NewPrompt;
  741.         NewPrompt:=G_I_Pages[G_I_Page].Template[NewPrompt]^.ReturnKeyPointer; { determine next record to move to }
  742.         Move_G_I_InputPromptBlockModule(OldPrompt,NewPrompt);
  743.       End { If CharEntry }
  744.     Else
  745.       If CharEntry In ['U','u'] Then
  746.         Begin
  747.           G_I_Data[NewPrompt,G_I_Page]^:='UNSHORED';
  748.           OldPrompt:=NewPrompt;
  749.           NewPrompt:=G_I_Pages[G_I_Page].Template[NewPrompt]^.ReturnKeyPointer; { determine next record to move to }
  750.           Move_G_I_InputPromptBlockModule(OldPrompt,NewPrompt);
  751.         End { If CharEntry }
  752.       Else { illegal character entry }
  753.         SoundError;
  754.   End;    { Construction }
  755.  
  756.  
  757.  
  758. Begin   { Special_G_I_CharEntryModule }
  759.   Case G_I_Page Of
  760.     1 : Begin
  761.           Case NewPrompt Of
  762.             10 : DeckOrientation(CharEntry);
  763.             11 : MemberType(CharEntry);
  764.             12 : Construction(CharEntry);
  765.           End; { Case NewPrompt }
  766.         End; { page 1 }
  767.     2 : Begin
  768.         End; { page 2 }
  769.     3 : Begin
  770.         End; { page 3 }
  771.     4 : Begin
  772.         End; { page 4 }
  773.   End; { Case G_I_Page }
  774. End;    { Special_G_I_CharEntryModule }
  775.  
  776.  
  777.  
  778. Procedure G_I_EntryModule;
  779.  
  780. { *************************************************************************** }
  781. { *                                                                         * }
  782. { *                    GENERAL INPUT PAGE ENTRY MODULE                      * }
  783. { *                                                                         * }
  784. { *    This module takes care of the display and user interaction with      * }
  785. { *    the program's general input pages.  This general input page module   * }
  786. { *    uses templates in controlling the interaction between the user and   * }
  787. { *    the displayed general input page.                                    * }
  788. { *                                                                         * }
  789. { *    A template is simply a file containing information about the         * }
  790. { *    prompts (or descriptors) to be displayed when a particular G_I_Page  * }
  791. { *    is shown.  A G_I_Page template is a series of records where each     * }
  792. { *    record describes one prompt and data entry field in that G_I_Page.   * }
  793. { *    For more information on templates see the toolkit documentation      * }
  794. { *    file 'TOOLKIT.DOC'.                                                  * }
  795. { *                                                                         * }
  796. { *************************************************************************** }
  797.  
  798. Var
  799.   OldPrompt:Integer;                   { an index to the previously highlighted input prompt }
  800.   CurrentPrompt:Integer;               { an index to the current highlighted input prompt }
  801.   ExitModule:Boolean;                  { a flag used in determining when to exit this input module }
  802.  
  803.  
  804.  
  805.   Procedure Init_G_I_Variables;
  806.  
  807.   { This procedure initializes the G_I_Page module's variables. }
  808.  
  809.   Begin   { Init_G_I_Variables }
  810.     OldPrompt:=2;
  811.     CurrentPrompt:=1;
  812.     ExitModule:=False;
  813.   End;    { Init_G_I_Variables }
  814.  
  815.  
  816.  
  817.   Procedure Escape;
  818.  
  819.   { This procedure controls the entry of a escape command.  Note that the case
  820.     statement below only supports 4 general input pages, but this can easily be
  821.     added to inorder to support additional general input pages.  Note that upon
  822.     issuing the escape command, the user is signaling that he wants to exit the
  823.     input pre-processor.  Before exiting the pre-processor the user is queried
  824.     to see if he wants to save his data. }
  825.  
  826.   Begin   { Escape }
  827.     Case G_I_Page Of
  828.       1 : Begin
  829.             WriteInputFileModule(ExitModule); { if passed boolean returns true, then exit this module }
  830.             If ExitModule Then
  831.               Begin { return to MainModule and then to first menu page }
  832.                 MenuPage:=1;
  833.                 CurrentPage:=Menu;
  834.               End; { If ExitModule }
  835.           End; { page 1 }
  836.       2 : Begin
  837.           End; { page 2 }
  838.       3 : Begin
  839.           End; { page 3 }
  840.       4 : Begin
  841.           End; { page 4 }
  842.     End; { Case G_I_Page }
  843.   End;    { Escape }
  844.  
  845.  
  846.  
  847.   Procedure PageUp;
  848.  
  849.   { This procedure controls the entry of a page up command.  Note that the case
  850.     statement below only supports 4 general input pages, but can easily be
  851.     added to inorder to support additional general input pages. }
  852.  
  853.   Begin   { PageUp }
  854.     Case G_I_Page Of
  855.       1 : Begin
  856.             SoundError;
  857.           End; { page 1 }
  858.       2 : Begin
  859.           End; { page 2 }
  860.       3 : Begin
  861.           End; { page 3 }
  862.       4 : Begin
  863.           End; { page 4 }
  864.     End; { Case G_I_Page }
  865.   End;    { PageUp }
  866.  
  867.  
  868.  
  869.   Procedure PageDown;
  870.  
  871.   { This procedure controls the entry of a page down command. Note that the
  872.     case statement below only supports 4 general input pages, but this can
  873.     easily be added to inorder to support additional general input pages. }
  874.  
  875.   Var
  876.     CharEntry:WorkString;              { character variable used in passing a dummy character entry to another procedure }
  877.  
  878.   Begin   { PageDown }
  879.     Case G_I_Page Of
  880.       1 : Begin
  881.  
  882.             { specific to example application of input pre-processor }
  883.             If G_I_Data[13,G_I_Page]^='' Then { beam span must be entered before allowing user to page downward }
  884.               Begin
  885.                 CharEntry:=Chr(81);      { send dummy character value (=PageDown Key) }
  886.                 G_I_ErrorCheckingModule(OldPrompt,CurrentPrompt,CharEntry);
  887.               End { If G_I_Data }
  888.             Else { exit this module and go to requested page }
  889.               Begin
  890.                 G_I_Page:=1;
  891.                 S_I_Page:=1;
  892.                 CurrentPage:=S_I; { pass control to S_I_InputModule }
  893.                 ExitModule:=True;
  894.               End; { Else }
  895.  
  896.           End; { page 1 }
  897.       2 : Begin
  898.           End; { page 2 }
  899.       3 : Begin
  900.           End; { page 3 }
  901.       4 : Begin
  902.           End; { page 4 }
  903.     End; { Case G_I_Page }
  904.   End;    { PageDown }
  905.  
  906.  
  907.  
  908.   Procedure CurseUp;
  909.  
  910.   { This procedure controls the cursor's upward movement in the current general
  911.     input page.  It checks the G_I_Page template to see if the requested cursor
  912.     move is allowable for the current G_I_Page. }
  913.  
  914.   Begin   { CurseUp }
  915.     With G_I_Pages[G_I_Page].Template[CurrentPrompt]^ do
  916.       Begin
  917.         If UpKeyPointer<>0 Then
  918.           Begin { legal move }
  919.             OldPrompt:=CurrentPrompt;
  920.             CurrentPrompt:=UpKeyPointer;
  921.             Move_G_I_InputPromptBlockModule(OldPrompt,CurrentPrompt);
  922.           End { If UpKeyPointer }
  923.         Else { not a legal move }
  924.           SoundError;
  925.       End; { With G_I_Pages }
  926.   End;    { CurseUp }
  927.  
  928.  
  929.  
  930.   Procedure CurseDown;
  931.  
  932.   { This procedure controls the cursor's downward movement in the current
  933.     general input page.  It checks the G_I_Page template to see if the
  934.     requested cursor move is allowable for the current G_I_Page. }
  935.  
  936.   Begin   { CurseDown }
  937.     With G_I_Pages[G_I_Page].Template[CurrentPrompt]^ Do
  938.       Begin
  939.         If DownKeyPointer<>0 Then
  940.           Begin { legal move }
  941.             OldPrompt:=CurrentPrompt;
  942.             CurrentPrompt:=DownKeyPointer;
  943.             Move_G_I_InputPromptBlockModule(OldPrompt,CurrentPrompt);
  944.           End { If DownKeyPointer }
  945.         Else { not a legal move }
  946.           SoundError;
  947.       End; { With G_I_Pages }
  948.   End;    { CurseDown }
  949.  
  950.  
  951.  
  952.   Procedure CurseLeft;
  953.  
  954.   { This procedure controls the cursor's leftward movement in the current
  955.     general input page.  It checks the G_I_Page template to see if the
  956.     requested cursor move is allowable for the current G_I_Page. }
  957.  
  958.   Begin   { CurseLeft }
  959.     With G_I_Pages[G_I_Page].Template[CurrentPrompt]^ Do
  960.       Begin
  961.         If LeftKeyPointer<>0 Then
  962.           Begin { legal move }
  963.             OldPrompt:=CurrentPrompt;
  964.             CurrentPrompt:=LeftKeyPointer;
  965.             Move_G_I_InputPromptBlockModule(OldPrompt,CurrentPrompt);
  966.           End { If LeftKeyPointer }
  967.         Else { not a legal move }
  968.           SoundError;
  969.       End; { With G_I_Pages }
  970.   End;    { CurseLeft }
  971.  
  972.  
  973.  
  974.   Procedure CurseRight;
  975.  
  976.   { This procedure controls the cursor's rightward movement in the current
  977.     general input page.  It checks the G_I_Page template to see if the
  978.     requested cursor move is allowable for the current G_I_Page. }
  979.  
  980.   Begin   { CurseRight }
  981.     With G_I_Pages[G_I_Page].Template[CurrentPrompt]^ Do
  982.       Begin
  983.         If RightKeyPointer<>0 Then
  984.           Begin { legal move }
  985.             OldPrompt:=CurrentPrompt;
  986.             CurrentPrompt:=RightKeyPointer;
  987.             Move_G_I_InputPromptBlockModule(OldPrompt,CurrentPrompt);
  988.           End { If RightKeyPointer }
  989.         Else { not a legal move }
  990.           SoundError;
  991.       End; { With G_I_Pages }
  992.   End;    { CurseRight }
  993.  
  994.  
  995.  
  996.   Procedure DeleteEntry;
  997.  
  998.   { This procedure controls the deletion of an entry for the current general
  999.     input page. }
  1000.  
  1001.   Begin   { DeleteEntry }
  1002.     G_I_Data[CurrentPrompt,G_I_Page]^:='';
  1003.     OldPrompt:=CurrentPrompt;
  1004.     Move_G_I_InputPromptBlockModule(OldPrompt,CurrentPrompt);
  1005.  
  1006.     { following routine is specific to the example application of the input pre-processor }
  1007.     If (CurrentPrompt=1) And (G_I_Page=1) Then
  1008.       RemoveNewFileLabel; { remove label describing user named input data file as a new file }
  1009.  
  1010.   End;    { DeleteEntry }
  1011.  
  1012.  
  1013.  
  1014.   Procedure Backspace(Var AccumCharEntry:Workstring);
  1015.  
  1016.   { This procedure removes the last character in the passed accumulated
  1017.     character entry for the current general input page. }
  1018.  
  1019.   Var
  1020.     CharEntry:Char;                    { character variable used in printing out the now shortened string }
  1021.     Col:Integer;                       { column index counter used in printing out the now shortened input data entry }
  1022.  
  1023.   Begin   { Backspace }
  1024.     If Length(AccumCharEntry)<>0 Then
  1025.       Begin
  1026.         Delete(AccumCharEntry,Length(AccumCharEntry),1); { remove last character in accumulated string entry }
  1027.         Show_G_I_EmptyEntry(CurrentPrompt);              { rewrite over old entry with empty input block }
  1028.         For Col:=1 To Length(AccumCharEntry) Do
  1029.           Begin                        { re-display newly shortened accumulated string entry }
  1030.             CharEntry:=Copy(AccumCharEntry,Col,1);
  1031.             Show_G_I_CharEntry(CharEntry);
  1032.           End; { For Col }
  1033.       End { If Length }
  1034.     Else { not able to remove any more characters from empty input data entry }
  1035.       SoundError;
  1036.   End;    { Backspace }
  1037.  
  1038.  
  1039.  
  1040.   Procedure CarriageReturn;
  1041.  
  1042.   { This procedure accepts the user's carriage return entry and in response
  1043.     moves the reversed video input block to the next defined input prompt.
  1044.     This procedure uses The G_I_Page template for the current G_I_Page to
  1045.     determine the next prompt it should move to. }
  1046.  
  1047.   Begin   { CarriageReturn }
  1048.     OldPrompt:=CurrentPrompt;
  1049.     CurrentPrompt:=G_I_Pages[G_I_Page].Template[CurrentPrompt]^.ReturnKeyPointer; { determine next record to move to }
  1050.     Move_G_I_InputPromptBlockModule(OldPrompt,CurrentPrompt);
  1051.   End;    { CarriageReturn }
  1052.  
  1053.  
  1054.  
  1055.   Procedure AccumulateEntry(    CharEntry:Char);Forward;
  1056.  
  1057.  
  1058.  
  1059.   Procedure UpgradeDate(    CharEntry:Char);
  1060.  
  1061.   { This procedure controls the upgrading of the date entry to the computer's
  1062.     clock date by making a call to DOS or by allowing the user to enter his
  1063.     own date. }
  1064.  
  1065.   Begin   { UpgradeDate }
  1066.     If CharEntry In ['U','u'] Then
  1067.       Begin { user requesting system date }
  1068.         G_I_Data[CurrentPrompt,G_I_Page]^:=Date1;
  1069.         OldPrompt:=CurrentPrompt;
  1070.         CurrentPrompt:=G_I_Pages[G_I_Page].Template[CurrentPrompt]^.ReturnKeyPointer; { determine next record to move to }
  1071.         Move_G_I_InputPromptBlockModule(OldPrompt,CurrentPrompt);
  1072.       End { If CharEntry }
  1073.     Else { user entering his own date }
  1074.       AccumulateEntry(CharEntry);
  1075.   End;    { UpgradeDate }
  1076.  
  1077.  
  1078.  
  1079.   Procedure UpgradeTime(    CharEntry:Char);
  1080.  
  1081.   { This procedure controls the upgrading of the time entry to the computer's
  1082.     clock time by making a call to DOS or by allowing the user to enter his
  1083.     own time. }
  1084.  
  1085.   Begin   { UpgradeTime }
  1086.     If CharEntry In ['U','u'] Then
  1087.       Begin { user requesting system time }
  1088.         G_I_Data[CurrentPrompt,G_I_Page]^:=Time;
  1089.         OldPrompt:=CurrentPrompt;
  1090.         CurrentPrompt:=G_I_Pages[G_I_Page].Template[CurrentPrompt]^.ReturnKeyPointer; { determine next record to move to }
  1091.         Move_G_I_InputPromptBlockModule(OldPrompt,CurrentPrompt);
  1092.       End { If CharEntry }
  1093.     Else { user entering his own time }
  1094.       AccumulateEntry(CharEntry);
  1095.   End;      { UpgradeTime }
  1096.  
  1097.  
  1098.  
  1099.   Procedure AccumulateEntry;{(    CharEntry:Char)}
  1100.  
  1101.   { This procedure controls the accumulation of inputed characters for a data
  1102.     entry for the current general input page.  Note that the call to
  1103.     Check_G_I_CharEntryModule checks to see if the CharEntry is legal, and if
  1104.     so then places the legal character into the AccumCharEntry. }
  1105.  
  1106.   Var
  1107.     AccumCharEntry:WorkString;         { string variable used to store the accumulated keyboard entry }
  1108.     MaxEntryLength:Integer;            { variable used to store maximum allowable data input entry length }
  1109.  
  1110.   Begin   { AccumulateEntry }
  1111.     AccumCharEntry:='';                { initialize accumulated keyboard entry }
  1112.     With G_I_Pages[G_I_Page].Template[CurrentPrompt]^ Do
  1113.       GotoXY(InputCol,InputRow);       { locate at start of the data entry }
  1114.     ShowBlinkingCursor;
  1115.     Check_G_I_CharEntryModule(CurrentPrompt,AccumCharEntry,CharEntry);
  1116.     Repeat
  1117.       Read(Kbd,CharEntry);
  1118.       If (CharEntry=Chr(27)) And KeyPressed Then  { Read illegal double character entry without executing code command. }
  1119.         Begin
  1120.           Read(Kbd,CharEntry);
  1121.           SoundError;
  1122.         End { If CharEntry }
  1123.       Else
  1124.         If CharEntry=Chr(8) Then       { backspace }
  1125.           Backspace(AccumCharEntry)
  1126.         Else
  1127.           If CharEntry<>Chr(13) Then   { carriage return }
  1128.             Check_G_I_CharEntryModule(CurrentPrompt,AccumCharEntry,CharEntry);
  1129.     Until CharEntry=Chr(13);           { carriage Return }
  1130.     HideBlinkingCursor;
  1131.     If (AccumCharEntry='.') Or (AccumCharEntry='-') Or (AccumCharEntry='-.') Then
  1132.       AccumCharEntry:='';              { remove meaningless entry }
  1133.     G_I_ErrorCheckingModule(OldPrompt,CurrentPrompt,AccumCharEntry);
  1134.     G_I_Data[CurrentPrompt,G_I_Page]^:=AccumCharEntry; { transfer accumulated data entry into data structure }
  1135.     OldPrompt:=CurrentPrompt;
  1136.     CurrentPrompt:=G_I_Pages[G_I_Page].Template[CurrentPrompt]^.ReturnKeyPointer; { determine next record to move to }
  1137.  
  1138.     { following routine is specific to the example application of the input pre-processor }
  1139.     If ((OldPrompt=1) Or (OldPrompt=2)) And (G_I_Page=1) Then
  1140.       ReadInputFileModule;             { pass control temporarily to ReadInputFileModule }
  1141.  
  1142.     Move_G_I_InputPromptBlockModule(OldPrompt,CurrentPrompt);
  1143.   End;    { AccumulateEntry }
  1144.  
  1145.  
  1146.  
  1147.   Procedure ReadKeyboard;
  1148.  
  1149.   { This procedure determines what the user's keyboard entry is.  It passes
  1150.     control to specific procedures within this module if a screen command
  1151.     dealing with the general input page is called upon. }
  1152.  
  1153.   Var
  1154.     KeyboardEntry:Char;                { variable used in storing the character read from the keyboard }
  1155.  
  1156.   Begin
  1157.     Read(Kbd,KeyboardEntry);
  1158.     If (KeyboardEntry=Chr(27)) And KeyPressed Then { read a character, check for a double character entry }
  1159.       Begin                            { double character entry }
  1160.         Read(Kbd,KeyboardEntry);
  1161.         Case Ord(KeyboardEntry) Of
  1162.           73 : PageUp;
  1163.           81 : PageDown;
  1164.           72 : CurseUp;
  1165.           80 : CurseDown;
  1166.           75 : CurseLeft;
  1167.           77 : CurseRight;
  1168.           83 : DeleteEntry;
  1169.           71 : DirectoryModule;
  1170.         Else { illegal keystroke }
  1171.           SoundError;
  1172.         End; { Case Ord(KeyboardEntry) }
  1173.       End { If KeyboardEntry }
  1174.     Else
  1175.       Begin                            { single character entry }
  1176.         Case Ord(KeyboardEntry) Of
  1177.           13 : CarriageReturn;
  1178.           27 : Escape;
  1179.         Else
  1180.           Begin { check for special character entry }
  1181.             Case CurrentPrompt Of
  1182.                7 : UpgradeDate(KeyboardEntry);
  1183.                8 : UpgradeTime(KeyboardEntry);
  1184.               10 : Special_G_I_CharEntryModule(OldPrompt,CurrentPrompt,KeyboardEntry);
  1185.               11 : Special_G_I_CharEntryModule(OldPrompt,CurrentPrompt,KeyboardEntry);
  1186.               12 : Special_G_I_CharEntryModule(OldPrompt,CurrentPrompt,KeyboardEntry);
  1187.             Else { accumulate data entry from user }
  1188.               AccumulateEntry(KeyboardEntry);
  1189.             End; { Case CurrentPrompt }
  1190.           End; { Else }
  1191.         End; { Case Ord(KeyboardEntry) }
  1192.       End; { Else }
  1193.   End;    { ReadKeyboard }
  1194.  
  1195.  
  1196.  
  1197. Begin   { G_I_P_EntryModule }
  1198.   Init_G_I_Variables;
  1199.   Draw_G_I_PagesModule;
  1200.   Repeat
  1201.     ReadKeyboard;
  1202.   Until ExitModule;
  1203. End;    { G_I_P_EntryModule }